package org.basis.algorithm.lru;


import java.util.LinkedHashMap;

/**
 * 自定义LRU算法实现（基于LinkedHashMap）
 *
 * @author Mr_wenpan@163.com 2022/01/16 19:07
 */
public class MyLruCache<K, V> extends LinkedHashMap<K, V> {

    /**
     * 记录最大容量
     */
    int limit;

    /**
     * 有参构造
     *
     * @param initialCapacity 初始容量
     * @param loadFactor      扩容负载因子
     * @param accessOrder     元素的排序模式：true表示按访问顺序排序,false表示插入顺序排序
     * @param limit           最大容量
     */
    public MyLruCache(int initialCapacity, float loadFactor, boolean accessOrder, int limit) {
        // 调用父类有参构造,true表示访问顺序,false表示插入顺序
        super(initialCapacity, loadFactor, accessOrder);
        this.limit = limit;
    }

    /**
     * 覆写removeEldestEntry方法，返回为true时移除最近最久未使用的元素
     * 该方法在元素插入后被吊起
     */
    @Override
    protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
        // 如果容器内元素个数大于等于了limit限制，则移除一个最近最久未使用的元素
        return limit < size();
    }

    public static void main(String[] args) {
        final int max = Integer.MAX_VALUE;
        final int min = Integer.MIN_VALUE;
        System.out.println("max = " + max);
        System.out.println("min = " + min);
        final int b = (2 << 31) - 2;
        System.out.println(b);
        System.out.println((max + 1));
        // 2147483647
        System.out.println("1111000000000000000000000000000".length());
        System.out.println(-100 >>> 2);
        System.out.println(-15 << 10);

        System.out.println(-15360 >> 10);

        System.out.println((-15 >> 31) & 1);
        System.out.println((-15 >> 31));
        System.out.println(Integer.toBinaryString(-4));
        System.out.println(Integer.toBinaryString(-128));
        System.out.println(Integer.toBinaryString((-15 >> 1)));


    }
}
